/*********************************************************
Copyright ©martin zhang(zhangming_233@163.com) 1998-2021. All rights reserved.
File name: 	  ${file_name}
Author:       ${author}
Version: 	  ${version}
Description:  // 用于详细说明此程序文件完成的主要功能，与其他模块
              // 或函数的接口，输出值、取值范围、含义及参数间的控
			  // 制、顺序、独立或依赖等关系
Others: 	  // 其它内容的说明
Log:          // 修改日志，包括修改内容，日期，修改人等
 *********************************************************/
#ifndef THREADPOOL_FIXEDTHREADPOOL_H
#define THREADPOOL_FIXEDTHREADPOOL_H

#include <pthread.h>

typedef void *(*jobcallback_t)(void *);

struct fixedthreadpool;

/**
 * 工作节点, 存放正在执行的线程信息
 * @note 每个节点对应一个线程
 */
typedef struct worker {
    pthread_t tid;                     /* 线程标识符 */
    struct fixedthreadpool *poolptr;   /* 归属线程池 */

    struct worker *prev;
    struct worker *next;
}nWorker_t;

/**
 * 工作队列
 * @note 执行任务的线程工作队列, 用双向循环链表实现, 每个节点是一个工作节点.
 * 工作队列的每个节点都是正在执行的作业, 而作业队列中的作业都是等待执行的.
 */
typedef struct workerqueue {
    nWorker_t *front;
    nWorker_t *rear;
}nWorkerQueue_t;

/**
 * 作业节点, 存放用户要执行的任务
 * @note 每个节点对应一个用户任务. 用双向循环链表节点, 实现该队列.
 */
typedef struct job {
    jobcallback_t job_func; /* 作业处理函数 */
    void *user_data;        /* 用户数据: 作业处理函数参数 */

    struct job *prev;
    struct job *next;
}nJob_t;

/**
 * 作业队列
 * @note 等待执行的用户作业队列, 用双向循环链表实现.
 * 工作队列的每个节点都是正在执行的作业, 而作业队列中的作业都是等待执行的.
 */
typedef struct jobqueue {
    nJob_t *front;
    nJob_t *rear;
}nJobQueue_t;

/**
 * 固定线程数目的线程池
 * @note 管理作业队列和工作队列
 */
typedef struct fixedthreadpool {
    nWorkerQueue_t workerqueue; /* 工作队列 */
    nJobQueue_t jobqueue;       /* 作业队列 */

    pthread_mutex_t mutex;      /* 互斥量 */
    pthread_cond_t notempty;    /* 条件变量: 作业队列非空 */

    int close;                  /* 关闭状态 */
}nFixedThreadPool;

int fixedthreadpool_create(nFixedThreadPool **poolpptr, int num);
int fixedthreadpool_addjob(struct fixedthreadpool *poolptr, jobcallback_t callback, void *arg);
void fixedthreadpool_destroy(struct fixedthreadpool *poolptr);

#endif //THREADPOOL_FIXEDTHREADPOOL_H
